package com.example.web.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.web.SysConst;
import com.example.web.dto.*;
import com.example.web.dto.query.*;
import com.example.web.entity.*;
import com.example.web.mapper.*;
import com.example.web.service.*;
import com.example.web.tools.dto.*;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import lombok.SneakyThrows;
import com.example.web.tools.*;
/**
 * 学校功能实现类
 */
@Service
public class CampusServiceImpl extends ServiceImpl<CampusMapper, Campus> implements CampusService {

	 /**
     * 操作数据库AppUser表mapper对象
     */
    @Autowired
    private AppUserMapper _AppUserMapper;
    /**
     * 操作数据库的Campus表mapper对象
     */
    @Autowired
    private CampusMapper _CampusMpper;


    /**
     * 学校分页查询
     */
    @SneakyThrows
    @Override
    public PagedResult<CampusDto> List(CampusPagedInput input) {

      
        //声明一个支持学校查询的(拉姆达)表达式
        LambdaQueryWrapper<Campus> queryWrapper = Wrappers.<Campus>lambdaQuery()
                .eq(input.getId()!=null&&input.getId()!=0,Campus::getId,input.getId())
                .eq(input.getCreatorId()!=null,Campus::getCreatorId,input.getCreatorId());
      
     	 //如果前端搜索传入Name不为空,则进行精确查询
        if(Extension.isNotNullOrEmpty(input.getName())) {
            queryWrapper=queryWrapper.eq(Campus::getName,input.getName());
       	 }
     	 //如果前端搜索传入Address不为空,则进行精确查询
        if(Extension.isNotNullOrEmpty(input.getAddress())) {
            queryWrapper=queryWrapper.eq(Campus::getAddress,input.getAddress());
       	 }
     	 //如果前端搜索传入LongitudeStartRange,则要大于LongitudeStartRange输入的值
         if(input.getLongitudeStartRange()!=null)
          {
            queryWrapper=queryWrapper.gt(Campus::getLongitude,input.getLongitudeStartRange());
          }
         //如果前端搜索传入LongitudeEndRange,则要小于LongitudeEndRange输入的值
      		 if(input.getLongitudeEndRange()!=null)
          {
            queryWrapper=queryWrapper.lt(Campus::getLongitude,input.getLongitudeEndRange());
          }
     	 //如果前端搜索传入LatitudeStartRange,则要大于LatitudeStartRange输入的值
         if(input.getLatitudeStartRange()!=null)
          {
            queryWrapper=queryWrapper.gt(Campus::getLatitude,input.getLatitudeStartRange());
          }
         //如果前端搜索传入LatitudeEndRange,则要小于LatitudeEndRange输入的值
      		 if(input.getLatitudeEndRange()!=null)
          {
            queryWrapper=queryWrapper.lt(Campus::getLatitude,input.getLatitudeEndRange());
          }
     	 //如果前端搜索传入DistanceStartRange,则要大于DistanceStartRange输入的值
         if(input.getDistanceStartRange()!=null)
          {
            queryWrapper=queryWrapper.gt(Campus::getDistance,input.getDistanceStartRange());
          }
         //如果前端搜索传入DistanceEndRange,则要小于DistanceEndRange输入的值
      		 if(input.getDistanceEndRange()!=null)
          {
            queryWrapper=queryWrapper.lt(Campus::getDistance,input.getDistanceEndRange());
          }
      
        //按创建时间从大到小排序 最新的显示在最前面
        queryWrapper=queryWrapper.orderByDesc(Campus::getCreationTime);
        //构建一个分页查询的model
        Page<Campus> page = new Page<>(input.getPage(), input.getLimit());
          
   
         //从数据库进行分页查询获取学校数据
        IPage<Campus> pageRecords= _CampusMpper.selectPage(page, queryWrapper);

        //获取所有满足条件的数据行数
        Long totalCount= _CampusMpper.selectCount(queryWrapper);

        //把Campus实体转换成Campus传输模型
        List<CampusDto> items= Extension.copyBeanList(pageRecords.getRecords(),CampusDto.class);
        for (CampusDto item : items) {
          
          //查询出关联的创建用户信息
            AppUserDto  CreatorAppUserDTO=new AppUserDto();
            AppUser  CreatorAppUserEntity= _AppUserMapper.selectOne(Wrappers.<AppUser>lambdaQuery().eq(AppUser::getId,item.getCreatorId()));
           if(CreatorAppUserEntity!=null) {
                BeanUtils.copyProperties(CreatorAppUserDTO, CreatorAppUserEntity);
                item.setCreatorAppUserDto(CreatorAppUserDTO);
            }  
         
        }
      
        //返回一个分页结构给前端
        return PagedResult.GetInstance(items,totalCount);

    }
  
    /**
     * 单个学校查询
     */
    @SneakyThrows
    @Override
    public CampusDto Get(CampusPagedInput input) {
       if(input.getId()==null)
        {
            return new CampusDto();
        }
        PagedResult<CampusDto>  pagedResult =List(input);
        return pagedResult.getTotalCount()>0?pagedResult.getItems().stream().findFirst().get():new CampusDto();
    }

    /**
     *学校创建或者修改
     */
    @SneakyThrows
    @Override
    public CampusDto CreateOrEdit(CampusDto input) {

        //声明一个学校实体
        Campus Campus = new Campus();

        //把前端传入的input参数拷贝到学校实体
        BeanUtils.copyProperties(Campus,input);

        //调用数据库的增加或者修改方法
        saveOrUpdate(Campus);

        //定义一个返回给前端的学校传输模型
        CampusDto CampusDto=new CampusDto();

        //同理把操作的学校实体拷贝给学校传输模型
        BeanUtils.copyProperties(CampusDto,Campus);

        //把传输模型返回给前端
        return CampusDto;
    }



}
